/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.ior;

import java.util.ArrayList;
import java.util.Iterator;

import org.omg.CORBA_2_3.portable.InputStream;
import org.omg.CORBA_2_3.portable.OutputStream;

import com.sun.corba.se.spi.ior.IORTemplate;
import com.sun.corba.se.spi.ior.IORTemplateList;
import com.sun.corba.se.spi.ior.ObjectId;
import com.sun.corba.se.spi.ior.IORTemplate;
import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.IORFactory;
import com.sun.corba.se.spi.ior.IORFactories;

import com.sun.corba.se.spi.orb.ORB;

public class IORTemplateListImpl extends FreezableList implements IORTemplateList {

  /* This class must override add( int, Object ) and set( int, Object )
   * so that adding an IORTemplateList to an IORTemplateList just results
   * in a list of TaggedProfileTemplates.
   */
  public Object set(int index, Object element) {
    if (element instanceof IORTemplate) {
      return super.set(index, element);
    } else if (element instanceof IORTemplateList) {
      Object result = remove(index);
      add(index, element);
      return result;
    } else {
      throw new IllegalArgumentException();
    }
  }

  public void add(int index, Object element) {
    if (element instanceof IORTemplate) {
      super.add(index, element);
    } else if (element instanceof IORTemplateList) {
      IORTemplateList tl = (IORTemplateList) element;
      addAll(index, tl);
    } else {
      throw new IllegalArgumentException();
    }
  }

  public IORTemplateListImpl() {
    super(new ArrayList());
  }

  public IORTemplateListImpl(InputStream is) {
    this();
    int size = is.read_long();
    for (int ctr = 0; ctr < size; ctr++) {
      IORTemplate iortemp = IORFactories.makeIORTemplate(is);
      add(iortemp);
    }

    makeImmutable();
  }

  public void makeImmutable() {
    makeElementsImmutable();
    super.makeImmutable();
  }

  public void write(OutputStream os) {
    os.write_long(size());
    Iterator iter = iterator();
    while (iter.hasNext()) {
      IORTemplate iortemp = (IORTemplate) (iter.next());
      iortemp.write(os);
    }
  }

  public IOR makeIOR(ORB orb, String typeid, ObjectId oid) {
    return new IORImpl(orb, typeid, this, oid);
  }

  public boolean isEquivalent(IORFactory other) {
    if (!(other instanceof IORTemplateList)) {
      return false;
    }

    IORTemplateList list = (IORTemplateList) other;

    Iterator thisIterator = iterator();
    Iterator listIterator = list.iterator();
    while (thisIterator.hasNext() && listIterator.hasNext()) {
      IORTemplate thisTemplate = (IORTemplate) thisIterator.next();
      IORTemplate listTemplate = (IORTemplate) listIterator.next();
      if (!thisTemplate.isEquivalent(listTemplate)) {
        return false;
      }
    }

    return thisIterator.hasNext() == listIterator.hasNext();
  }
}
